package com.dc.commons.jpa.repository;

import java.io.Serializable;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.repository.NoRepositoryBean;

import com.dc.commons.persistence.able.IDAble;

/*******************************************************************************<P>
 * 文件名: BaseRepository.java <br>
 * 版本: 1.0<br>
 * 描述:<br>
 * 版权所有: <br>
 * <P>
 * 创建者: 王建栋 <br>
 * 创建日期: 2015年12月22日 下午5:20:13<br>
 * 修改者: <br>
 * 修改日期: <br>
 * 修改说明: <br>
 ******************************************************************************/
@NoRepositoryBean
public interface BaseRepository<T extends IDAble ,ID extends Serializable> {

	/**
	 * 保存对象
	 * @param entity
	 * @return S
	 */
	public <S extends T> S save(S entity);
	
	/**
	 * 保存列表
	 * @param entities
	 * @return Iterable
	 */
	public <S extends T> Iterable<S> save(List<S> entities);
	
	/**
	 * 保存对象
	 * @param entity
	 * @return S
	 */
	public <S extends T> S update(S entity);
	
	/**
	 * 根据 ID查找对象
	 * @param id
	 * @return T
	 */
	public T findOne(ID id);
	
	/**
	 * 查找所有
	 * @return List
	 */
	public List<T> findAll();
	
	/**
	 *  根据排序查找所有数据
	 * @param sort
	 * @return List
	 */
	public List<T> findAll(Sort sort);
	
	/**
	 * 根据条件分页查找
	 * @param pageable
	 * @return Page
	 */
	public Page<T> findAll(Pageable pageable);
	
	/**
	 * 删除
	 * @param t
	 */
	public void delete(T t);
	
	/**
	 * 根据主键删除
	 * @param id
	 */
	public void deleteById(ID id);
	/**
	 * 根据主键列表删除
	 * @param idList
	 */
	public void deleteByIds(List<ID> idList);
	
	/**
	 * 删除列表
	 * @param list
	 */
	public void deleteAll(List<T> list);
	
	/**
	 * 删除全部
	 */
	public void deleteAll();
	
	
	/**
	 * 根据条件查找符合条件的数据
	 * 
	 * @param spec
	 * @return T
	 */
	public T findOne(Specification<T> spec);

	/**
	 * 根据条件查找
	 * 
	 * @param spec
	 * @return List
	 */
	public List<T> findAll(Specification<T> spec);

	/**
	 * 根据条件分页查找
	 * @param spec
	 * @param pageable
	 * @return Page
	 */
	public Page<T> findAll(Specification<T> spec, Pageable pageable);

	/**
	 * 根据查询条件，排序规则返回列表
	 * 
	 * @param spec
	 * @param sort
	 * @return List
	 */
	public List<T> findAll(Specification<T> spec, Sort sort);

	/**
	 * 根据条件统计
	 * 
	 * @param spec the {@link Specification} to count instances for
	 * @return the number of instances
	 */
	public long count(Specification<T> spec);
}
